﻿//////////////////////////////////////////////////////////////////////
/**
* 普通函数
*/

//------------------------------------------
// 检查URL是否附合要求,反回实际的URL或者返回N
// ULL, 在这里加入对特殊网站的支持
// 除非返回-1,否则显示图标
/*
	mp3.baidu.com
	mp3.gougou.com
	music.yisou.com	
	www.chinamp3.com
*/
function CTP_CheckURL(Url) {

	if (!Url) return - 1;
	// normal	
	var patrn = /^http:\/\/.+\.mp3$/;
	if (patrn.test(Url)) return 0; //0 表示直接可用, > 1 表示需进一步分析可用, -1 表示不可用
	// local file
	var patrn = /^file:\/\/.+\.mp3$/;
	if (patrn.test(Url)) return 0;

	// mp3.baidu.com
	var patrn = /^http:\/\/.+(&tn=baidusg|&tn=baidumt).+(&word=mp3).+/;
	if (patrn.test(Url)) return 1;

	// mp3.gougou.com
	var patrn = /^http:\/\/.+(&usrinput=).+(&plt=).+/;
	if (patrn.test(Url)) return 2;

	//music.yisou.com	
	var patrn = /^\/m\/mp3\/link\.php\?link=.*\.mp3.*/;
	if (patrn.test(Url)) return 3;

	/* 这里加入新的支持*/

	//--------------
	// no match
	return - 1;
}

//------------------------------------------
// 得到真正的URL
function CTP_getRealURL(Url) {

	//可直接使用的URL
	if (CTP_CheckURL(Url) == 0) {
		// 加入此链接到播放列表 	
		CTP_addToURLList(Url);
		CTP_setListHeight();

		// 开始试听
		CTP_Stop();
		CTP_Controller.Url = Url;
		CTP_playPause();
		return true;
	}

	//取链接里面的链接
	//music.yisou.com
	if (CTP_CheckURL(Url) == 3) {

		var Lreg = /\/m\/mp3\/link\.php\?link=(.*\.mp3).*/;

		var Llinks = Url.match(Lreg);

		var realLink = UrlH.decode(Llinks[1]);

		myDump("realURL: " + realLink);

		if (CTP_CheckURL(realLink) != 0) {
			alert("不支持的链接格式!");
			setCTPText("分析链接地址失败", null, null, null);
			return;
		}

		// 加入此链接到播放列表 	
		CTP_addToURLList(realLink);
		CTP_setListHeight();

		// 开始试听
		CTP_Stop();
		CTP_Controller.Url = Url;
		CTP_playPause();

		return true;

	}

	//需要到达子页面里取得URL
	if (CTP_CheckURL(Url) >= 1) {
		myDump("Start To Get Real Url.");

		isCTPTextCanSet = false;

		setCTPText("正在分析音频地址, 请稍候...", null, null, null);

		//设置显示信息倒计时
		setTimeout("isCTPTextCanSet = true ; setCTPText('分析链接地址超时',null,null,null)", 10000);

		//-------------------------------------
		CTP_browser.setAttribute("id", "bookmarkpreviews-browser");
		CTP_browser.setAttribute("width", 1);
		CTP_browser.setAttribute("height", 1);
		CTP_browser.setAttribute("type", "content");
		CTP_browser = document.documentElement.appendChild(CTP_browser);

		var flags = Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY;
		CTP_browser.loadURIWithFlags(Url, flags, null, null);
		CTP_browser.hidden = false;

		/* The canvas can't save flash/java so don't waste time loading it*/
		CTP_browser.docShell.allowPlugins = false;
		/* So it doesn't launch any windows as its working in the background*/
		CTP_browser.docShell.allowJavascript = false;
		/* don't throw up password dialogs */
		CTP_browser.docShell.allowAuth = false;
		//CTP_browser.addProgressListener(this,Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
		// 防止多次调用
		isCTP_RealUrlPageLoadedCalled = false;
		CTP_browser.addEventListener("DOMContentLoaded", CTP_RealUrlPageLoaded, true);

		//alert("OK");
		//-------------------------------------
		return true;
	}

	// 不合适
	alert("不支持的链接格式!");
	return false;
}

//------------------------------------------
// 子页面加载完时响应, 分析页面中的URL
function CTP_RealUrlPageLoaded() {

	//防止多次调用
	if (isCTP_RealUrlPageLoadedCalled) return;
	isCTP_RealUrlPageLoadedCalled = true;

	// 停止加载, 节省带宽
	CTP_browser.stop();

	var docH = CTP_browser.contentDocument;

	//-------------------------------------
	//mp3.baidu.com
	if (CTP_CheckURL(CTP_browser.currentURI.spec) == 1) {

		var varHtml = docH.body.innerHTML;

		// 取得加密后的链接
		var Jreg = /var\s*I\s*=\s*"([0-9a-zA-Z:\/\.%\s]*[\u4E00-\u9FA5]*[.0-9a-zA-Z]*)"\s*,/;

		var Jlinks = varHtml.match(Jreg);

		// 取得链接参数
		var Freg = /var\s*F\s*=\s*([0-9]*)\s*,/;

		var Fvars = varHtml.match(Freg);

		// 解密运算
		//alert(Jlinks[1]);
		//alert(Fvars[1]);
		var realLink = baiduA(Jlinks[1], Fvars[1]);

		myDump("realURL: " + realLink);
		// realLink 就是百度音乐搜索里的最终音频链接了, 哈哈!
		isCTPTextCanSet = true;

		if (CTP_CheckURL(realLink) != 0) {
			alert("不支持的链接格式!");
			setCTPText("分析链接地址失败", null, null, null);
			return;
		}

		CTP_AddtoListAndPlay(realLink);

		return true;

	}

	//-------------------------------------
	// mp3.gougou.com
	if (CTP_CheckURL(CTP_browser.currentURI.spec) == 2) {
		var varHtml = docH.body.innerHTML;

		// 取得加密后的链接
		var Jreg = /var\s*furlArr\s*=\s*\[\s*"([0-9a-zA-Z:\/\.%\s]*[\u4E00-\u9FA5]*[.0-9a-zA-Z]*)"/;

		var Jlinks = varHtml.match(Jreg);

		realLink = Jlinks[1];

		myDump("realURL: " + realLink);

		isCTPTextCanSet = true;

		if (CTP_CheckURL(realLink) != 0) {
			setCTPText("分析链接地址失败", null, null, null);
			alert("不支持的链接格式!");
			return;
		}

		CTP_AddtoListAndPlay(realLink);

		return true;
	}

}

//------------------------------------------
// 加入播放列表并播放
function CTP_AddtoListAndPlay(realLink) {

	// 加入此链接到播放列表 	
	CTP_addToURLList(realLink);
	CTP_setListHeight();

	// 开始试听
	CTP_Stop();
	CTP_Controller.Url = realLink;
	CTP_playPause();

}

//------------------------------------------
// 百度反解密
function baiduA(url, pn) {
	var F = pn,
	L = 0;
	var I = url,
	E = "";
	var K = [],
	H = [];
	function N(S, P, Q) {
		for (var R = S; R <= P; R++) {
			K[R] = R + Q;
			H[R + Q] = R
		}
	}
	N(0, 9, 48);
	N(10, 35, 55);
	N(36, 61, 61);
	var M = F % 26;
	M = M ? M: 1;
	function A(Q) {
		var P = Q.length;
		var S = "";
		for (var R = 0; R < P; R++) {
			var T = Q.charAt(R);
			if (/[A-Za-z0-9]/.test(T)) {
				var U = H[Q.charCodeAt(R)] - M;
				if (U < 0) {
					U += 62
				}
				T = String.fromCharCode(K[U])
			}
			S += T
		}
		return S
	}
	E = A(I);
	return E;
}

//------------------------------------------
// 检测isFlashEnable变量, 如果为flase, 表明Flash播放器不工作
function CTP_CheckIsFlashEnable() {
	if (!isFlashEnable) {
		alert("您好, 程序检测到ClickToPlay似乎不能正常工作\n\n看到浏览器状态栏里的ClickToPlay播放条了吗?\n\n请在播放条界面点击右键, 选择'程序设置', 并按提示操作!\n\n由此给您带来不便深表谦意!");
		isCheckDialogShowed = true;
		isFirstRun = true;
	} else {
		isFirstRun = false;
		myDump("Flash Work Normally.");
	}
}

//------------------------------------------
// 记录日志
function myDump(aMessage) {
	if (!aMessage) return;
	// 检测错误 
	if (aMessage.substr((aMessage.length - 5), 5) == "#2028") {
		// flash权限设置错误 	
		isFlashEnable = false;
		if (!isCheckDialogShowed) CTP_CheckIsFlashEnable();
	}

	if (!debugMode) return;
	var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
	consoleService.logStringMessage(aMessage);
}


//------------------------------------------
// 由链接地址得到文件名
function getFilename(url) {
	var filename = url;
	var index = filename.indexOf("?");
	if (index > -1) {
		filename = filename.substring(0, index); //remove the query.
	}
	index = filename.indexOf("#");
	if (index > -1) {
		filename = filename.substring(0, index); //remove the fragment.
	}
	return UrlH.decode(filename.substring(filename.lastIndexOf("/") + 1));
}

//------------------------------------------
//设置按钮图片
function setPlayPauseImage(type) {

	var image = (type == "pause") ? "pause_small.png": "play_small.png";
	var handle = document.getElementById("cplayer_play");
	handle.style.listStyleImage = "url(chrome://clicktoplay/skin/" + image + ")";
}

//------------------------------------------
//设置按钮文本
function setCTPText(value, author, title, time) {
	var handle = document.getElementById("cplayer_text");

	if (!value) {
		if (author + title) value = author + " - " + title + "  " + time;
		else value = getFilename(CTP_Controller.Url) + "  " + time;
	}

	handle.setAttribute("value", value);

}

//------------------------------------------
// 设置Panel时间和标题作者
function setCPanelText(title, author, album, time) {
	var handle = document.getElementById("cplayer_panel_title");
	if (title) handle.setAttribute('value', title);
	else handle.setAttribute('value', getFilename(CTP_Controller.Url));

	var handle = document.getElementById("cplayer_panel_author");
	if (author) handle.setAttribute('value', "作者: " + author);
	else handle.setAttribute('value', "作者: 未知");

	var handle = document.getElementById("cplayer_panel_album");
	if (album) handle.setAttribute('value', "专辑: " + album);
	else handle.setAttribute('value', "专辑: 未知");

	var handle = document.getElementById("cplayer_panel_time");
	if (time) handle.setAttribute('value', time);
	else handle.setAttribute('value', "00:00/00:00");

}

//------------------------------------------
//得到绝对位置
function GetAbsPoint(e) {
	var oRect = e.getBoundingClientRect();
	return {
		top: oRect.top,
		left: oRect.left,
		width: e.offsetWidth,
		height: e.offsetHeight,
		bottom: oRect.bottom,
		right: oRect.right
	}
}

//------------------------------------------
//计算时间字符串
function CalcTimeStr(tm) {
	var totalLength = Math.floor(tm / 1000);
	//alert(totalLength);
	//---------------------------
	var totalSec = totalLength % 60;
	if (totalSec < 10) totalSec = "0" + totalSec.toString();

	var totalMin = Math.floor(totalLength / 60);
	if (totalMin < 10) totalMin = "0" + totalMin.toString();

	var totalStr = totalMin + ":" + totalSec;

	return totalStr;
}

//////////////////////////////////////////////////////////////////////
/**
* 主窗口界面控制
*/

//------------------------------------------
//主宿口进度条控制
function CTP_refreshWin(playPercent) {

	//--	
	if (!playPercent) playPercent = 0;

	var length = 100 * playPercent;

	document.getElementById("cplayer_panel_meter").setAttribute("value", length);
	//--
}

//------------------------------------------
// 选择列表项
function CTP_URLSelect() {
	var listH = document.getElementById("cplayer_panel_list");

	CTP_URLList.curIndex = listH.selectedIndex;

	var cellText = listH.selectedItem.value;

	CTP_URLList.curUrl = cellText;

}

//------------------------------------------
// 双击列表项
function CTP_URLDbclick() {

	CTP_URLSelect();
	CTP_PlayList();
}

//------------------------------------------
// 播放列表项
function CTP_PlayList() {
	CTP_Stop();
	CTP_Controller.Url = CTP_URLList.curUrl;
	CTP_Controller.curIndex = CTP_URLList.curIndex;
	CTP_playPause();
	
}

//------------------------------------------
// 添加列表项
function CTP_addToURLList(label) {

	var listH = document.getElementById("cplayer_panel_list");
	listH.appendItem(getFilename(label), label);

	//选中当前
	CTP_Controller.curIndex = listH.getRowCount() - 1;
}

//------------------------------------------
// 删除更表项
function CTP_URLList_Del() {
	var listH = document.getElementById("cplayer_panel_list");
	if (listH.selectedIndex == -1) return;

	//同步curIndex
	if (listH.selectedIndex == CTP_Controller.curIndex) CTP_Controller.curIndex = null; //当前播放项不在列表中
	else if (listH.selectedIndex < CTP_Controller.curIndex) CTP_Controller.curIndex--;

	listH.removeItemAt(listH.selectedIndex);
	CTP_setListHeight();
}

//------------------------------------------
// 清空列表项
function CTP_URLList_Clear() {

	if (!confirm("你确定要清空播放列表吗 ?")) return;

	CTP_Controller.curIndex = null;

	var listH = document.getElementById("cplayer_panel_list");

	var listNum = listH.getRowCount();

	for (var i = listNum - 1; i >= 0; i--) {
		listH.removeItemAt(i);
	}

	CTP_setListHeight();
}

//------------------------------------------
// 设置列表高度
function CTP_setListHeight() {
	var listH = document.getElementById("cplayer_panel_list");
	if (listH.getRowCount() >= 1) {
		listH.setAttribute("height", 200);
	} else {
		listH.setAttribute("height", 25);
	}

}

//////////////////////////////////////////////////////////////////////
/**
* 按钮响应函数
*/

//------------------------------------------
// 播放暂停按钮
function CTP_playPause() {
	if (CTP_Controller.Url == null) return;

	CTP_Controller.playPause();

	setCPanelText(null, null, null,null);
}

//------------------------------------------
// 停止播放按钮
function CTP_Stop() {

	CTP_Controller.closeFile();

	// 窗口界面初始化, 未加载时状态
	document.getElementById("cplayer_panel_meter").setAttribute("value", 0);
	document.getElementById("cplayer_panel_time").setAttribute("value", "00:00/00:00");

}

//------------------------------------------
// 保存文件按钮
function CTP_Save() {
	var href = CTP_Controller.Url;
	if (href == null) return;
	saveImageURL(href, null, "SaveImageTitle", false, false, makeURI(href));

}

//------------------------------------------
// 恢复上一次播放状态
function CTP_lastPlay() {

	myDump("lastPlay: " + isLastPlaying);
	//------------
	// 读取配置
	var shouldPlay = CTP_Prefs.getBoolPref("lastPlayOn");

	myDump("lastPlayOn: " + shouldPlay);

	if (!shouldPlay) {
		CTP_Controller.Position = 0;
		return;
	}
	if (isLastPlaying == true && CTP_Controller.isPlay == false) {
		CTP_Controller.loadFile();
		CTP_Controller.isPlay = false;
		CTP_playPause();
	}
}

//------------------------------------------
// 显示主界面
function CTP_ShowWin() {
	var handle = document.getElementById("cplayer_disp");

	if (isWinShow == true) {
		// 隐藏
		handle.style.listStyleImage = "url(chrome://clicktoplay/skin/disp.png)";
		isWinShow = false;

		document.getElementById("cplayer_panel").hidePopup();
		CTP_openRefresh = false;

		return;
	}

	// 选中当前播放项
	CTP_setListHeight();

	var listH = document.getElementById("cplayer_panel_list");
	listH.selectItem(listH.getItemAtIndex(listH.getRowCount() - 1));
	// 显示
	handle.style.listStyleImage = "url(chrome://clicktoplay/skin/hide.png)";
	isWinShow = true;

}

//------------------------------------------
// 调节播放进度 
function CTP_scaleBeginDrag() {
	isScaleDrag = true;
}

//------------------------------------------
function CTP_scaleEndDrag() {
	var scaleH = document.getElementById("cplayer_panel_meter");
	var value = scaleH.getAttribute("value");

	var pos = (value / 100) * CTP_Controller.getLength();

	if (CTP_Controller.isPlay) {
		CTP_Controller.playPause();
		CTP_Controller.Position = pos;
		CTP_Controller.playPause();
	} else if (CTP_Controller.isLoad) {
		CTP_Controller.Position = pos;
	} else {
		scaleH.setAttribute("value", 0);
	}

	isScaleDrag = false;
}


//////////////////////////////////////////////////////////////////////
/**
* 菜单响应函数
*/

//------------------------------------------
// CTP菜单响应
function CTP_open(type) {
	if (type == 0) {
		loadURI("http://blog.sina.com.cn/jxxghp");
	} else if (type == 1) {
		alert("Firefox 在线试听插件 - ClickToPlay\n\n作者: 广东工业大学 计算机科学与技术9班 黄平\n\nJxxghp<jxxghp@163.com>\n\n关于该设计的详细资料请查看'使用说明'!");
	} else if (type == 2) {
		loadURI("chrome://clicktoplay/content/help/Help.html");
	}else if (type == 3) {
		alert("如果发现不能播放, 请按以下步骤设置播放器:\n\n1. 在将要打开的页面中选'全局安全性设置'\n\n2. 在'全局安全性设置'面板中选择'始终充许'\n\n3. 将Firefox所在目录(或者Firefox目录所在盘)加入信任列表\n\n4. 重启浏览器\n\n5. 点击确定以打开页面进行上述操作!");
		loadURI("http://www.macromedia.com/support/documentation/cn/flashplayer/help/settings_manager04.html");
	}

}

//------------------------------------------
// 右键菜单播放全部
function CTP_menuPlayAll(event) {
	myDump("Menu: PlayAll");

	var strRef = document.commandDispatcher.focusedWindow.document.URL;

	//var strCookie = document.commandDispatcher.focusedWindow.document.cookie;
	//g_comQQDownloadFFH.AddCmnInfo(strCookie);
	var strLinks = document.commandDispatcher.focusedWindow.document.links;
	var nLinkNum = strLinks.length;

	var succLink = 0;
	var wrongLink = 0;

	for (var i = 0; i < nLinkNum; i++) {
		// strLinks[i].href;
		// 全部播放只支持一层的链接
		if (CTP_CheckURL(strLinks[i].href) == 0) {
			succLink++;
			CTP_addToURLList(strLinks[i].href);
		} else {
			wrongLink++;
		}
	}

	//done
	alert("操作完成!\n\n总链接数: " + nLinkNum + "\n添加链接数: " + succLink + "\n丢弃链接数: " + wrongLink + "\n\n请打开播放列表查看!");
}

//------------------------------------------
// 右键菜单播放
function CTP_menuPlay(event) {
	myDump("Menu: Play");

	if (!gContextMenu.onLink && !gContextMenu.onImage) {
		return;
	}

	var strUrl = "";
	if (gContextMenu.onLink && ( - 1 == gContextMenu.link.toString().indexOf("javascript:"))) {
		strUrl = gContextMenu.link.toString();
	} else {
		strUrl = gContextMenu.target.src;
	}
	//得到真的URL
	CTP_getRealURL(strUrl);
}

//------------------------------------------
// 播放选中文本链接
function CTP_menuPlayText(event) {
	myDump("Menu: PlayText");

	var selText = document.commandDispatcher.focusedWindow.getSelection().toString();

	//alert(selText);
	CTP_getRealURL(selText);

}

//------------------------------------------
// 右键菜单显示控制
function CTP_menuDisplay() {
	myDump("Menu: Show");

	if (gContextMenu.onSaveableLink) gContextMenu.showItem("CTPMenu_Play", true);
	else gContextMenu.showItem("CTPMenu_Play", false);

	if (gContextMenu.isTextSelected) gContextMenu.showItem("CTPMenu_PlayText", true);
	else gContextMenu.showItem("CTPMenu_PlayText", false);

	gContextMenu.showItem("CTPMenu_Sep", true);
	gContextMenu.showItem("CTPMenu_PlayAll", true);

}

//------------------------------------------
// 音量控制
function CTP_VolumeSet(s) {
	var value = CTP_Controller.getVolume();
	if (s) value = value + 0.1;
	else value = value - 0.1;

	value = value > 1 ? 1 : value;

	value = value < 0 ? 0 : value;

	CTP_Controller.setVolume(value);

	myDump("Menu: Valume Set: " + CTP_Controller.getVolume());
}

//------------------------------------------
//添加URL
function CTP_Add_URL() {
	var url = window.prompt("请输入需要添加的URL地址", "http://");

	CTP_getRealURL(url);

}

//////////////////////////////////////////////////////////////////////
/**
* Flash交互函数区，供AS调用
*/

//------------------------------------------
// 输出日志到输出窗口
function JS_writeLog(msg) {
	myDump("AS: " + msg);
}

//------------------------------------------
// 歌曲播放完成时触发
function JS_soundComplete() {
	if (isCTPTextCanSet) setCTPText("准备就绪...", null, null, null);
	setPlayPauseImage("play");
	CTP_Controller.isPlay = false;
	isScallMove = true;
	//--------------
	// 列表数大于一则播放下一曲
	var listH = document.getElementById("cplayer_panel_list");

	var listNum = listH.getRowCount();

	if (listNum > 1) {

		//停止当前
		CTP_Stop();

		CTP_Controller.isLoad = false;

		//计算新的编号
		if (CTP_Controller.curIndex < listNum - 1) CTP_Controller.curIndex++;
		else CTP_Controller.curIndex = 0; //循环播放
		// 更新列表
		var listH = document.getElementById("cplayer_panel_list");

		CTP_URLList.curIndex = CTP_Controller.curIndex;

		CTP_URLList.curUrl = listH.getItemAtIndex(CTP_Controller.curIndex).value;

		CTP_Controller.Url = CTP_URLList.curUrl;

		// 开始播放
		CTP_playPause();

	} else {
		setTimeout("CTP_SetCompleteStat()", 1000);
	}
}

//------------------------------------------
// 设置完成状态
function CTP_SetCompleteStat() {
	CTP_Controller.Position = 0;
	document.getElementById("cplayer_panel_meter").setAttribute("value", 0);
	document.getElementById("cplayer_panel_time").setAttribute("value", "00:00/" + CalcTimeStr(CTP_Controller.getLength()));

}

//------------------------------------------
// 加载歌曲时触发, 计算加载进度, 加载完成时显示总长度
function JS_loadProgress(loadPercent) {
	if (isCTPTextCanSet) setCTPText("正在加载... " + loadPercent + "%", null, null, null);
	if (loadPercent >= 99) CTP_Controller.loadComplete = true;
}

//------------------------------------------
// 产生IO错误时触发
function JS_ioError(msg) {
	setCTPText("IOError: " + msg, null, null, null);
	CTP_Stop();
}

//------------------------------------------
// 取得ID3信息时触发
function JS_id3Handler(id3Str) {
	if (id3Str == "||") return;

	var id3Array = id3Str.split("|");
	CTP_Controller.Author = id3Array[0];
	CTP_Controller.Title = id3Array[1];
	CTP_Controller.Album = id3Array[2];

	//将取得的哥曲名加入列表显示
	var listH = document.getElementById("cplayer_panel_list");
	listH.getItemAtIndex(CTP_Controller.curIndex).label = CTP_Controller.Author + " - " + CTP_Controller.Title;
	
}

//------------------------------------------
// 计算播放进度条
function JS_onEnterFrame(playPercent) {
	CTP_Controller.playPercent = playPercent;

	var tLength = CTP_Controller.getLength();
	var pLength = tLength * playPercent;

	if (CTP_Controller.loadComplete == true) {

		if (isCTPTextCanSet) setCTPText(null, CTP_Controller.Author, CTP_Controller.Title, CalcTimeStr(tLength - pLength));

	}
	if (!isScallMove) setCPanelText(CTP_Controller.Title, CTP_Controller.Author, CTP_Controller.Album, CalcTimeStr(pLength) + "/" + CalcTimeStr(tLength));

	if (!isScaleDrag && !isScallMove) CTP_refreshWin(playPercent);

}

//////////////////////////////////////////////////////////////////////
/**
* 初始化与反初始化
*/

//------------------------------------------
// 初始化事件
function initCTP() {
	window.addEventListener("load", CTP_init, false);
	window.addEventListener("unload", CTP_uninit, false);
}


//------------------------------------------
// Load初始化
function CTP_init() {

	URLfetcher.Init();

	//PopupMenu Init	
	var menu = document.getElementById("contentAreaContextMenu");
	menu.addEventListener("popupshowing", CTP_menuDisplay, false);
	
	// 流媒体监听
	AddEmbedListener();

}

//------------------------------------------
// 反初始化
function CTP_uninit() {

	URLfetcher.unInit();
}

//////////////////////////////////////////////////////////////////////
/**
* 系统初始化
*/

initCTP();